102. 二叉树的层序遍历

102. 二叉树的层序遍历

题目链接
代码随想录

分析

我最开始的想法,是先用中序遍历遍历所有元素(这样,同一层的左边的元素始终排在这一层右边的元素的前面),同时带高度信息,将遍历结果结果放到一个列表里面,然后从头遍历列表,根据节点的高度,来将节点进行分离。
但是官方答案更巧妙,直接使用队列这个数据结构,具体过程如下:

思路是
创建一个队列,并将根节点放入其中,注意根节点可能为空。

其巧妙的地方在于:

这个题也可以用递归来做,但是没有那么巧妙,还是用队列来做简洁高明。

层序遍历或者说广度优先遍历的本质,就是一层层的遍历。

解题

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        Deque<TreeNode> queue = new ArrayDeque<>();
        if(root!=null){
            queue.offer(root);
        }
        while(!queue.isEmpty()){
            // 这里一次循环就是遍历一层的节点
            // 获取这一层的长度
            int size = queue.size();
            List<Integer> list = new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode node = queue.poll();
                list.add(node.val);
                // 移除一个节点的时候,将其子节点放到队列中
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }
            result.add(list);
        }
        return result;
    }
}

相关题

107. 二叉树的层序遍历 II
199. 二叉树的右视图
637. 二叉树的层平均值
429. N 叉树的层序遍历
515. 在每个树行中找最大值
116. 填充每个节点的下一个右侧节点指针
117. 填充每个节点的下一个右侧节点指针 II
104. 二叉树的最大深度
111. 二叉树的最小深度